home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 April / PCWorld_2008-04_cd.bin / domacnost a kancelar / ubericon / UberIcon-v1.0.3.exe / {app} / Plugins / iBounce / Source / iBounce.cpp next >
C/C++ Source or Header  |  2005-08-14  |  11KB  |  297 lines

  1. // iBounce.cpp
  2. // ---------------------------------------------------------------------------------
  3. // iBounce was created as an example of the ▄berIcon plugin system.  Until we finalize
  4. // the plugin system and properly document it, this example will be your gateway to
  5. // writing your own plugins for ▄berIcon.
  6.  
  7. // Some important things to note:
  8. // An option's Group and Name will ALWAYS be passed thru the translation engine
  9. // for the user interface.  This has no effect from the plugin's point-of-view, but
  10. // you should ALWAYS try to use words/phrases that have ALREADY BEEN TRANSLATED
  11. // to ensure that people from all over the world can understand your options.
  12. // To find words that are already translated, look in your language's ini file
  13. // (english="Languages\1033.ini")
  14.  
  15. // If you're adding a group or option that has not been translated, feel free to
  16. // write it out as more than one word (eg "my option").  Our translation system can
  17. // easily handle translating this later on.  We stick to single-words for easier
  18. // development...
  19.  
  20. // If you're adding a custom window/interface for your options, remember to use the
  21. // Uber_Translate() function to translate text to display.  the string you pass MUST
  22. // be MAX_PATH characters long to avoid buffer overflows. Remeber that "Bonjour" is
  23. // longer than "Hello" :)
  24. //
  25. // Example:
  26. // wchar_t text[MAX_PATH]=L"Hello";
  27. // Uber_Translate(text);//text is now "Bonjour"...
  28.  
  29. // More about the Options System:
  30. // Each Option has 4 properties.
  31. // 1) Group        -> The name of the option's logical group
  32. // 2) Name        -> The name of the option
  33. // 3) Value        -> A UINT value that is remembered for you...
  34. // 4) sValue    -> A string value that is remembered for you...
  35. //
  36. // The Option GroupModes act as follows:
  37. // UBER_GROUPMODE_NORMAL    ->    Normal option...
  38. // UBER_GROUPMODE_HIDDEN    ->    Invisible option (simply used for storing info)...
  39. // UBER_GROUPMODE_CHECKBOX  ->    Similar to NORMAL, only a Checkbox is shown next to
  40. //                                Options with a non-zero value.
  41. // UBER_GROUPMODE_RADIO        ->    Similar to CHECKBOX, only when you set an option's
  42. //                                value, all other options in the group rest to 0
  43. //
  44. // ALL MODES call your OptionSelected() procedure
  45. // ---------------------------------------------------------------------------------
  46.  
  47. #include "stdafx.h"
  48. #include "../../../UberAPI/UberAPI.h"
  49.  
  50.  
  51. LRESULT CALLBACK IconProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  52. VOID CALLBACK IconTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
  53.  
  54. Gdiplus::GdiplusStartupInput gdiplusStartupInput;
  55. ULONG_PTR  gdiplusToken;
  56.  
  57. BOOL APIENTRY DllMain( HANDLE hModule, 
  58.                        DWORD  ul_reason_for_call, 
  59.                        LPVOID lpReserved
  60.                      )
  61. {
  62.  
  63.     switch(ul_reason_for_call)
  64.     {
  65.     case DLL_PROCESS_ATTACH://Init
  66.         {
  67.             //Plugin Info (Automatically Hidden)
  68.             Uber_AddOption(L"PluginInfo", L"Name", 0, L"iBounce");//Overrides the display name of the Plugin :)
  69.             Uber_AddOption(L"PluginInfo", L"Version", 0, L"1.0");//Might be used in the future
  70.             Uber_AddOption(L"PluginInfo", L"Author", 0, L"PolyVector");//Might be used in the future
  71.             Uber_AddOption(L"PluginInfo", L"URL", 0, L"www.punksoftware.com");//Might be used in the future
  72.             Uber_AddOption(L"PluginInfo", L"Contact", 0, L"support@punksoftware.com");//Might be used in the future
  73.  
  74.             //Options for the user
  75.             Uber_SetOptionGroupMode(L"PluginSettings", UBER_GROUPMODE_CHECKBOX);
  76.             Uber_AddOption(L"PluginSettings", L"Async", false, L"");
  77.  
  78.             Uber_AddOption(L"", L"AboutPlugin", 0, L"");
  79.  
  80.  
  81.             //The following is a demonstration of the HIDDEN GroupType...
  82.             //The Option "FirstTime" is created in a hidden group and
  83.             //is set to 'true' by default...
  84.             //After the plugin is run for the first time it's set to false
  85.             Uber_SetOptionGroupMode(L"Hidden", UBER_GROUPMODE_HIDDEN);
  86.             Uber_AddOption(L"Hidden",L"FirstTime",true,L"");
  87.             if(Uber_GetOption(L"Hidden",L"FirstTime"))
  88.             {
  89.                 //MessageBox(0,L"This is the first time this plugin has been loaded",L"Notice",0);
  90.                 Uber_SetOption(L"Hidden",L"FirstTime",false);
  91.             }
  92.             
  93.  
  94.             //Icon Zoomer Class
  95.             WNDCLASSEX wcex;
  96.             wcex.cbSize = sizeof(WNDCLASSEX); 
  97.             wcex.style            = CS_HREDRAW | CS_VREDRAW;
  98.             wcex.lpfnWndProc    = (WNDPROC)IconProc;
  99.             wcex.cbClsExtra        = 0;
  100.             wcex.cbWndExtra        = 0;
  101.             wcex.hInstance        = NULL;
  102.             wcex.hIcon            = NULL;
  103.             wcex.hCursor        = NULL;
  104.             wcex.hbrBackground    = NULL;
  105.             wcex.lpszMenuName    = _T("");
  106.             wcex.lpszClassName    = _T("iZoomWnd");
  107.             wcex.hIconSm        = NULL;
  108.             RegisterClassEx(&wcex);
  109.  
  110.             // Initialize Gdiplus
  111.             GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  112.  
  113.         }
  114.  
  115.         break;
  116.     case DLL_PROCESS_DETACH://Exit
  117.         //MessageBox(0,L"Plugin Exit",L"",0);
  118.  
  119.         // Shutodwn Gdiplus
  120.         Gdiplus::GdiplusShutdown(gdiplusToken);
  121.         break;
  122.     }
  123.     return TRUE;
  124. }
  125.  
  126. //OptionSelected()
  127. //-------------------------------------------------------
  128. //This function is called when an UBER_GROUPMODE_CALLBACK
  129. //Option is clicked on.
  130. //-------------------------------------------------------
  131. bool UBERFUNCTION OptionSelected(wchar_t* Group, wchar_t* Name)
  132. {
  133.     //MessageBox(0,Name,Group,0);
  134.     if(!wcscmp(Group,L""))
  135.     {
  136.         if(!wcscmp(Name,L"AboutPlugin"))
  137.         {
  138.             wchar_t About[MAX_PATH]=L"AboutPlugin";
  139.             Uber_Translate(About);
  140.             MessageBox(0,L"iBounce was created by PunkSoftware\n\nIf you are interested in developing Effects\nlook in the 'Plugins' folder for sourcecode.",About,0);
  141.         }
  142.     }
  143.     return true;
  144. }
  145.  
  146. //ActivateIcon()
  147. //---------------------------------------------------------
  148. //This function gets called each time an Icon is Activated
  149. //Simply start your ⁿber cool special effect here :)
  150. //Icon execution is blocked until this function returns
  151. //
  152. //A simple SetTimer() or CreateThread() call will allow for
  153. //async special effects :)
  154. //---------------------------------------------------------
  155. bool UBERFUNCTION ActivateIcon(UBER_ICON* data)
  156. {
  157.     //IMPORTANT NOTES:
  158.     //Create the window invisible and later show it with SW_SHOWNOACTIVATE
  159.     //This will prevent focus from leaving the current window.
  160.     //Using WS_EX_TRANSPARENT will prevent users clicking on the effect's window
  161.     HWND hWnd=CreateWindowEx(WS_EX_TOPMOST| WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, _T("iZoomWnd"), _T(""), WS_POPUP | WS_CLIPSIBLINGS, 0, 0, 64, 64, NULL, NULL, NULL, NULL);
  162.     ShowWindow(hWnd,SW_SHOWNOACTIVATE);
  163.  
  164.  
  165.     Gdiplus::Bitmap* IconBitmapCopy=NULL;
  166.  
  167.     IconBitmapCopy=data->bitmap->Clone(0,0,data->bitmap->GetWidth(),data->bitmap->GetHeight(),PixelFormat32bppARGB);
  168.  
  169.     SetProp(hWnd,_T("IcoBmp"),(HANDLE)IconBitmapCopy);
  170.     RECT ItemRect=data->rect;
  171.     SetProp(hWnd,_T("midX"),(HANDLE)((ItemRect.right+ItemRect.left)/2));//MiddleX
  172.     SetProp(hWnd,_T("midY"),(HANDLE)((ItemRect.bottom+ItemRect.top)/2));//MiddleY
  173.     int minSize=(ItemRect.bottom-ItemRect.top);
  174.     SetProp(hWnd,_T("minSize"),(HANDLE)minSize);//MiddleY
  175.     int SysIconSize=GetSystemMetrics(SM_CXICON);
  176.     int maxSize=SysIconSize*4;
  177.     if(maxSize<minSize+(SysIconSize*2))
  178.         maxSize=minSize+(SysIconSize*2);
  179.     SetProp(hWnd,_T("maxSize"),(HANDLE)maxSize);//MiddleY
  180.     SetProp(hWnd,_T("ms"),(HANDLE)0);
  181.  
  182.     if(Uber_GetOption(L"PluginSettings", L"Async"))
  183.     {
  184.         //animate fx while loading (sometimes ugly)
  185.         SetTimer(hWnd,NULL,1000/75,IconTimerProc);
  186.     }
  187.     else
  188.     {
  189.         //Wait for fx to finish before continuing (smoooooth)
  190.         while(IsWindow(hWnd))
  191.             IconTimerProc(hWnd,0,0,0);
  192.     }
  193.     return true;
  194. }
  195.  
  196. LRESULT CALLBACK IconProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  197. {
  198.     return DefWindowProc(hWnd,message,wParam,lParam);
  199. }
  200.  
  201. const double pi=3.141592653589793238462643;
  202. float GetSineWave(float x,float middleX,float WaveWidth,float WaveHeight)
  203. {
  204.     float Result;
  205.     x-=middleX;
  206.  
  207.     x+=WaveWidth/2.0f;
  208.     if(x<0)
  209.         x=0;
  210.     if(x>WaveWidth)
  211.         x=WaveWidth;
  212.  
  213.     Result=sin((pi*x)/WaveWidth) * WaveHeight;
  214.     //if(Result<0)
  215.     //    Result=0;
  216.     return Result;
  217. }
  218.  
  219. VOID CALLBACK IconTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
  220. {
  221.             int OldMS=(int)GetProp(hWnd,_T("ms"));
  222.             if(!OldMS)
  223.             {
  224.                 OldMS=GetTickCount();
  225.                 SetProp(hWnd,_T("ms"),(HANDLE)OldMS);
  226.             }
  227.             int NewMS=GetTickCount();
  228.             Gdiplus::Bitmap* IconBitmap=(Gdiplus::Bitmap*)GetProp(hWnd,_T("IcoBmp"));
  229.             if(IconBitmap)
  230.             {
  231.                 int MinSize=(int)GetProp(hWnd,_T("minSize"));
  232.                 int MaxSize=(int)GetProp(hWnd,_T("maxSize"));
  233.                 int MaxMS=400;
  234.                 int IconSize=MinSize+GetSineWave(float(NewMS-OldMS),float(MaxMS/2),float(MaxMS),MaxSize-MinSize);
  235.                 POINT WindowOrg;
  236.                 WindowOrg.x=(int)GetProp(hWnd,_T("midX"))-(IconSize/2);
  237.                 WindowOrg.y=(int)GetProp(hWnd,_T("midY"))-(IconSize/2);
  238.  
  239.                 //Setup Buffer
  240.                 HBITMAP BufferBM;
  241.                 HDC BufferDC;
  242.                 BITMAPINFO BufferBMInfo;
  243.                 ZeroMemory(&BufferBMInfo,sizeof(BITMAPINFO));
  244.                 BufferBMInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  245.                 BufferBMInfo.bmiHeader.biWidth=IconSize;
  246.                 BufferBMInfo.bmiHeader.biHeight=IconSize;
  247.                 BufferBMInfo.bmiHeader.biPlanes=1;
  248.                 BufferBMInfo.bmiHeader.biBitCount=32;
  249.                 BufferDC=CreateCompatibleDC(NULL);
  250.                 BufferBM=CreateDIBSection(BufferDC,&BufferBMInfo,DIB_RGB_COLORS,NULL,NULL,NULL);
  251.                 SelectObject(BufferDC,BufferBM);
  252.                 Gdiplus::Graphics graphics(BufferDC);
  253.                 graphics.SetCompositingMode(CompositingModeSourceCopy);
  254.                 graphics.SetCompositingQuality(CompositingQualityHighSpeed);
  255.                 graphics.SetInterpolationMode(InterpolationModeBilinear);
  256.  
  257.                 //Start Rendering
  258.                 int TrailCount=1;
  259.                 int IconSizeOffset=0;
  260.                 for(float i=0;i<TrailCount;i++)
  261.                 {
  262.                     //IconSizeOffset=(float(GetTickCount()%100)/100*(IconSize));
  263.                     IconSizeOffset=((IconSize-IconBitmap->GetWidth())/TrailCount)*(i);
  264.                     graphics.DrawImage(    IconBitmap,
  265.                         Gdiplus::Rect(IconSizeOffset/2,IconSizeOffset/2,IconSize-IconSizeOffset,IconSize-IconSizeOffset),
  266.                         0,
  267.                         0,
  268.                         IconBitmap->GetWidth(),
  269.                         IconBitmap->GetHeight(),
  270.                         Gdiplus::UnitPixel,
  271.                         NULL);
  272.                     graphics.SetCompositingMode(CompositingModeSourceOver);
  273.                 }
  274.  
  275.                 SIZE BufferSize={IconSize,IconSize};
  276.                 POINT SrcOrg={0,0};
  277.                 BLENDFUNCTION Blend;
  278.                 Blend.BlendOp=AC_SRC_OVER;
  279.                 Blend.BlendFlags=0;
  280.                 Blend.SourceConstantAlpha=255;//BYTE(255*alpha);
  281.                 Blend.AlphaFormat=AC_SRC_ALPHA;
  282.  
  283.                 UpdateLayeredWindow(hWnd,0,&WindowOrg,&BufferSize,BufferDC,&SrcOrg,RGB(0,0,0),&Blend,ULW_ALPHA);
  284.  
  285.                 DeleteDC(BufferDC);
  286.                 DeleteObject(BufferBM);
  287.                 if((NewMS-OldMS)>=MaxMS)
  288.                 {
  289.                     KillTimer(hWnd,NULL);
  290.                     ShowWindow(hWnd,SW_HIDE);
  291.                     DestroyWindow(hWnd);
  292.                     SetProp(hWnd,_T("IcoBmp"),NULL);
  293.                     delete IconBitmap;
  294.                 }
  295.             }
  296.  
  297. }